【C++】static关键字及其修饰的静态成员变量/函数详解

您所在的位置:网站首页 c 函数前加static 【C++】static关键字及其修饰的静态成员变量/函数详解

【C++】static关键字及其修饰的静态成员变量/函数详解

2024-07-10 03:10| 来源: 网络整理| 查看: 265

什么是static?static的引入

static 是 C/C++ 中很常用的修饰符,它被用来控制变量的存储方式和可见性。

静态数据的存储全局(静态)存储区

全局(静态)存储区在内存区域中的划分,如下图所示:

全局(静态)存储区:分为data段和bass段。data段(全局初始化区)存放初始化的全局变量和静态变量;bass段(全局未初始化区)存放未初始化的全局变量和静态变量。程序运行结束时自动释放。其中bass段在程序执行之前会被系统自动清0,所以未初始化的全局变量和静态变量在程序执行之前已经为0。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。

在 C++ 中 static 的内部实现机制:静态数据成员要在程序一开始运行时就必须存在。因为函数在程序运行中被调用,所以静态数据成员不能在任何函数内分配空间和初始化。 这样,它的空间分配有三个可能的地方,一是作为类的外部接口的头文件,那里有类声明;二是类定义的内部实现,那里有类的成员函数定义;三是应用程序的 main() 函数前的全局数据声明和定义处。 静态数据成员要实际地分配空间,故不能在类的声明中定义(只能声明数据成员)。类声明只声明一个类的"尺寸和规格",并不进行实际的内存分配,所以在类声明中写成定义是错误的。它也不能在头文件中类声明的外部定义,因为那会造成在多个使用该类的源文件中,对其重复定义。 static 被引入以告知编译器,将变量存储在程序的静态存储区而非栈上空间,静态数据成员按定义出现的先后顺序依次初始化,注意静态成员嵌套时,要保证所嵌套的成员已经初始化了。消除时的顺序是初始化的反顺序。

优势: 可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。静态数据成员的值对每个对象都是一样,但它的值是可以更新的。只要对静态数据成员的值更新一次,保证所有对象存取更新后的相同的值,这样可以提高时间效率。

static成员概念

声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化。

static成员特性

静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区。如下代码:

代码语言:javascript复制class Student { public: Student(const char name[], int idea, int grade) { strcpy(_name, name); _idea = idea; _grade = grade; } static int GetPostalCode() { return _postalCode; } private: char _name[10]; int _idea; int _grade; static int _postalCode; }; int Student::_postalCode = 710400; int main() { cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3